package com.wholesmart.web.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.wholesmart.common.bean.Message;
import com.wholesmart.common.bean.Page;
import com.wholesmart.mapper.entity.Code;
import com.wholesmart.service.CodeService;

/**
 * 数据字典控制器
 * 
 * <pre>
 * 开发约定： 
 * 
 * 1、顶级字典的level设置为"1"。
 * 
 * 2、数据字典的编号不能修改，提供修改数据字典名称和修改数据字典状态的接口。
 * 
 * 3、不提供数据字典的新增接口和删除接口。
 * 
 * 4、通过数据库脚本初始化数据字典。
 * 
 * 5、在程序中，每一类子级数据字典都需要有与之对应的一个枚举类，所有顶级字典集也要有与之对应的一个枚举类。
 * 
 * 6、加载数据字典下拉框时需要传入顶级字典code（本系统默认）；如果前端解耦code，需要为每一种顶级字典定义专有的加载接口。
 * 
 * 7、字典表的description字段需要写入介绍字典功能的描述。
 * 
 * 8、被禁用的数据字典将不会出现在数据字典下拉框中。
 * 
 * 9、定义顶级数据字典时应思虑周全，保证其子类字典可以涵盖所有情况；如不确定，可指定备用子级字典，并将备用子级字典设置为禁用。
 *     
 * 10、字典类型（0系统，1用户），字典状态（0启用，1禁用）
 * </pre>
 * 
 * @author dyw
 * @date 2020年1月9日
 */
@RestController
@RequestMapping("/code")
public class CodeController {
	@Autowired
	private CodeService codeService;

	/**
	 * 修改数据字典名
	 * 
	 * @param id   数据字典记录的ID
	 * @param name 数据字典名
	 * @return
	 */
	@GetMapping("/modify/name")
	public Message modifyName(Long id, String name) {
		codeService.setNameById(id, name);
		return Message.success();
	}

	/**
	 * 修改数据字典状态
	 * 
	 * @param id     数据字典记录的ID
	 * @param status 数据字典状态
	 * @return
	 */
	@GetMapping("/modify/status")
	public Message modifyStatus(Long id, String status) {
		codeService.setStatusById(id, status);
		return Message.success();
	}

	/**
	 * 分页条件查询
	 * 
	 * <pre>
	 * 有效查询条件包括：数据字典名（模糊匹配），数据字典状态（精确匹配），数据字典级别（精确匹配）
	 * 
	 * {"page":{
	 *     "pageSize":10,
	 *     "currentPage":1,
	 *     "orderFile":"id",
	 *     "orderType":"asc"
	 *         },
	 *   "condition"{
	 *      "name":"数据字典名",
	 *      "status":"XC220",
	 *      "level":"1"
	 *         }
	 *   }
	 * </pre>
	 *
	 * @param params 分页和条件参数
	 * @return 包含数据字典列表数据
	 */
	@PostMapping("/query/page")
	public Message queryPage(@RequestBody Map<String, Object> params) {
		Page<Code> page = codeService.getPage(params);
		return Message.success(page);
	}

	/**
	 * 根据一级字典的编号（code）查询其下属的所有子级字典
	 * 
	 * @param topCode 一级字典编号
	 * @return 子级字典列表（包含子级字典的全部字段信息）
	 */
	@GetMapping("/query/subCodes")
	public Message querySubCodes(String topCode) {
		List<Code> result = codeService.getSubCodesByPCode(topCode);
		return Message.success(result);
	}

	/**
	 * 根据一级字典的编号（code）查询其下属的所有子级字典，用于系统相关页面的数据字典下拉框数据的获取
	 * 
	 * @param topCode 一级字典编号
	 * @return 子级字典列表（只包含子级字典的名称和编号字段信息，不会获取被禁用的字典）
	 */
	@GetMapping("/query/tree")
	public Message listCodeTree(String topCode) {
		List<Map<String, String>> result = codeService.getCodeTree(topCode);
		return Message.success(result);
	}
}
